package _剑指offer.二叉树;

import util.TreeNode;
import org.junit.Test;

import java.util.LinkedList;
import java.util.List;

/**
 * 算法流程
 * pathSum(root, sum) 函数：
 *      初始化： 结果列表 res ，路径列表 path 。
 *      返回值： 返回 res 即可。
 *      
 * recur(root, target) 函数：
 *      递推参数： 当前节点 root ，当前目标值 target
 *      终止条件： 若节点 root 为空，则直接返回
 *      递推逻辑
 *          1、路径更新：将当前的 root.val 加入路径 path
 *          2、目标值更新：target -= root.val
 *          3、路径记录：当 root 为叶子节点 且 路径和等于目标值 即 target==0，将 path 加入 result
 *          4、前序遍历：遍历左 / 右子树
 *          5、路径恢复，删除当前节点
 *      
 */
public class _34_二叉树中和为某一值的路径 {
    @Test
    public void main() {
        Integer[] input = new Integer[]{5,4,8,11,null,13,4,7,2,null,null,5,1};
        TreeNode root = TreeNode.getTreeFromArray(input);
        List<List<Integer>> results = pathSum(root, 22);
        System.out.println("[");
        results.forEach(list -> System.out.println("  " + list + " ,"));
        System.out.println("]");
    }
    
    private List<Integer> path = new LinkedList<>();
    private List<List<Integer>> result = new LinkedList<>();
    
    public List<List<Integer>> pathSum(TreeNode root, int sum) {
        recur(root, sum);
        return result;
    }
    
    private void recur(TreeNode root, int target) {
        if (root == null) return;
        path.add(root.val);
        target -= root.val;
        if (target == 0 && root.left == null && root.right == null) result.add(new LinkedList<>(path));
        recur(root.left, target);
        recur(root.right, target);
        path.remove(path.size()-1);
    }
}
